Page({
  data: {
    buttonText: '发送', // 按钮的文字
    inputValue: '', // 用于绑定输入框的值
    messages: [], // 用于存储聊天消息的数组
    toBottom: '', // 用于控制滚动视图到最新消息
    sequence: getApp().globalData.historiesLength, // 历史消息数组的编号
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 检查各类参数
    console.log("Loading chat page, options.enableSendCard = " + options.enableSendCard +
      ", options.targetHistoryItem = " + options.targetHistoryItem +
      ", globalData.historiesLength = " + getApp().globalData.historiesLength);

    // 选择发送医疗信息卡，由AI分析情况，此处使用模拟数据
    if (options.enableSendCard === 'true') {
      // 从缓存中获取医疗信息卡内容，并封装成一条消息
      const newMessage = {
        content: "MyCard: " + JSON.stringify(wx.getStorageSync('myCard')) + JSON.stringify(wx.getStorageSync('inputValues')),
        type: 'sent',
        avatar: '',
      };
      // 模拟结果信息
      const receivedMessage = {
        content: '您患有肺炎，对青霉素过敏，正在服用盐酸帕罗西汀。您应该避免使用含有青霉素的抗生素，选择其他类型的抗生素，并在医生的指导下使用。您也应该按照医嘱，逐渐减停盐酸帕罗西汀，以免发生撤药反应。请咨询您的医生或医疗机构，以获得最适合您的治疗方案。',
        type: 'received',
        avatar: '../../../img/edu-white-bunny.jpg',
      };
      // 保存发送的消息，并修改按钮文字
      this.setData({
        messages: this.data.messages.concat(newMessage),
        toBottom: 'message-' + this.data.messages.length,
        buttonText: '等待回复',
      });
      // 模拟等待分析结果
      setTimeout(() => {
        this.setData({
          messages: this.data.messages.concat(receivedMessage),
          toBottom: 'message-' + this.data.messages.length,
          buttonText: '发送',
        });
      }, 2500);
    }

    // 选择从历史记录开始
    if (options.targetHistoryItem) {
      // 读取消息历史记录
      const storedMessages = wx.getStorageSync('chatMessages' + options.targetHistoryItem);
      if (storedMessages) {
        console.log('消息读取成功' + storedMessages.length);
        // 将消息历史记录保存到页面的消息数组中
        this.setData({
          messages: storedMessages,
          sequence: options.targetHistoryItem, // 历史消息数组的编号
          toBottom: 'message-' + (storedMessages.length - 1) // 重点讲一下获取ID的过程
        });
      } else {
        console.log('消息读取失败');
      }
    }

    // 直接开始对话不做操作

  },

  // 当输入框内容改变时触发
  inputChange(e) {
    this.setData({
      inputValue: e.detail.value,
    });
  },

  // 发送消息按钮点击事件
  sendMessage() {
    const that = this;
    const inputValue = this.data.inputValue.trim(); // 获取输入框内容并去除两端空格
    if (inputValue === '') {
      return; // 如果输入内容为空，则不执行发送操作
    }
    // 封装消息
    const newMessage = {
      content: inputValue,
      type: 'sent', // 发送的消息
      avatar: '',
    };
    // 将新消息添加到消息数组中
    const messages = this.data.messages.concat(newMessage);
    // 讲一下发送和缓存的顺序，先缓存再发送
    // 否则若发送后离开页面太快，会无法保存最后一条消息
    // 关于网络问题另行考虑，比如检测发送是否成功，若发送失败则由用户选择重发

    // 保存发送的消息，并修改按钮文字
    this.setData({
      messages: messages,
      inputValue: '',
      toBottom: 'message-' + this.data.messages.length,
      buttonText: '等待回复',
    });

    // 保存消息记录到缓存中，上云后保存到服务器数据库中
    wx.setStorage({
      key: 'chatMessages' + that.data.sequence,
      data: messages,
      success(res) {
        console.log('消息记录保存成功：' + that.data.sequence);
      },
      fail(err) {
        console.error('消息记录保存失败', err);
      },
    });

    // 准备一条收到的消息
    const receivedMessage = {
      content: '',
      type: 'received',
      avatar: '../../../img/edu-white-bunny.jpg',
    };

    // 消息发送与接收逻辑，使用了天行数据的API
    // Promise 风格是 JavaScript 中用于处理异步操作的一种机制，它可以更优雅地处理异步代码，避免了传统的回调地狱问题。
    function sendMessage(newMessage) {
      return new Promise((resolve, reject) => {
        wx.request({
          url: 'https://apis.tianapi.com/robot/index',
          method: 'POST',
          data: {
            key: 'b18f86c4209a89af561564ebd4280981',
            question: inputValue
          },
          header: {
            'Content-Type': 'application/x-www-form-urlencoded'
          },
          success: function (res) {
            if (res.data.code == 200) {
              console.log(res);
              resolve(res.data.result.reply); // 使用 resolve 返回结果
            }
          },
          fail: function (err) {
            console.log(err);
            reject(err); // 发生错误时使用 reject
          }
        });
      });
    }

    // 发送消息
    sendMessage(newMessage).then(reply => {
      receivedMessage.content = reply;
      console.log(receivedMessage);
      const updatedMessages = this.data.messages.concat(receivedMessage);
      wx.setStorage({
        key: 'chatMessages' + that.data.sequence,
        data: updatedMessages,
        success(res) {
          console.log('消息记录保存成功：' + that.data.sequence);
        },
        fail(err) {
          console.error('消息记录保存失败', err);
        },
      });
      // 保存发送的消息，并修改按钮文字
      this.setData({
        messages: updatedMessages,
        toBottom: 'message-' + this.data.messages.length,
        buttonText: '发送',
      });
    }).catch(error => {
      console.error('发送消息出错：', error);
    });
  },

  // bindconfirm 事件监听输入框的确认（回车）事件。
  onConfirm() {
    this.sendMessage();
  },

  leaveConversation: function () {
    wx.navigateBack({
      delta: 1 // 返回上一个页面
    });
  }
});